package com.txq.bilibili.app.view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.GridView;

/**
 * Created by yun on 2015/2/7.
 */

/**
 * 继承GridView 实现在scrollView中能够完整显示的GridView，
 * 这种情况通常不推荐 在Scrollview放Gridview 和listview
 * 如果必须采用这种方式 那么就用自定义的eGridView和listview
 * 来实现 确保高度 但是 GridView和Listview的优化可能失效
 *
 */
public class FullGridView extends GridView {

    //一个自定义view 知识点1： 构造方法
    //2.Layout布局的引用

    /**
     * 构造方法 通常用于在代码中创建View控件时  使用
     * 这个方法只能够在代码中创建view
     * @param context
     */
     public FullGridView(Context context){
         super(context);
     }

    /**
     * 如果一个自定义的view 需要放到layout.xml文件中那么必须提供这个构造方法
     *
     * @param context
     * @param attributeSet
     */
    public FullGridView(Context context, AttributeSet attributeSet){

        super(context,attributeSet);
    }

    //对于在Scrollview中的Gridview  需要重写一个方法 onmeasure（int，int）

    /**
     * 本方法通常在父容器Layout计算尺寸的时候 需要向子控件或者容器
     * 问一下子控件的大小  这时子控件就要算一下自己有多大  然后返回给父容器
     * 当子控件或者、子容器要就算自己多大时会进行一个回调方法
     * 这个方法就是onmeasure（）
     * 这个方法内部必须要设置自身的尺寸 这样父容器才知道 有多大
     * @param widthMeasureSpec 宽度尺寸规格  宽度包含了父容器允许控件最大的有多宽
     * @param heightMeasureSpec 高度尺寸规格  高度规格里包含了父容器允许子控件最大有多高
     *                          同时还有是wrap_content
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       //获取宽度规格中的宽度数值
        int wSize= MeasureSpec.getSize(widthMeasureSpec);
        int wMode= MeasureSpec.getMode(widthMeasureSpec);

          //获取高度规格中的高度数值
        int hSize= MeasureSpec.getSize(heightMeasureSpec);
        int hMode= MeasureSpec.getMode(heightMeasureSpec);

        //Wsize --父容器给当前控件提供的最大空间
        //或者是在layout文件中我们制定的数值尺寸 如200dp
        //实际获取的数值  单位是像素  如果布局采用dp 单位
        //那么此处获取到的像素和布局写的数值可能会不tong
        Log.d("youshare", "wsize=" + wSize);
        Log.d("youshare", "hsize=" + hSize);

        //mode 代表了尺寸计算的方式
        //MeasureSpec 里面提供了尺寸就算模式的常量方式


        switch (hMode){

            case MeasureSpec.AT_MOST://包含了wrap_content
                break;
            case MeasureSpec.EXACTLY://包含了match_parent
                break;
            case MeasureSpec.UNSPECIFIED:
                break;

        }
        //如果我们能够把hsize设置一个很大的值 并且将这个尺寸就算模式调整为 AT_MOST（wrap_content)
        //那么这个Gridview将能够完全显示


        //重新生成一个int值 这个值通过MeasureSpec将size和mode组合
        //就可以 让Gridview放大

        heightMeasureSpec= MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 1, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
